Argo CDのApplication SetとApp of apps patternの違いと使い分け
「Argo CDのApplication SetとApp of apps patternはどう違うの?」
どちらも複数のApplicationを一度にArgo CD上に作成することができます。
どう違うのか気になったので、ブログにしてみました。
結論
- 同一構成のApplicationを複数環境にデプロイしたい -> Application Set
- Application間の依存関係やデプロイ順を制御したい -> App of apps pattern
Application SetとApp of apps patternの概要
それぞれの概要を紹介します。
ArgoCDのサンプルアプリケーションのguestbookを、2つのApplicationにデプロイすることを想定してサンプルを紹介します。
Application Set
Argo CDのApplication Setは、同じ構成を持つ複数のApplicationを自動的に展開するためのカスタムコントローラーです。
templateを定義して、Applicationごとに変えたい部分(デプロイ先Cluster等)をパラメータにして定義することができます。
サンプル
templateセクションに共通部分を書き、generatorsセクションにApplicationごとに変えたいパラメータを書きます。
apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: guestbook spec: generators: - list: elements: - cluster: app1 url: https://1.2.3.4 - cluster: app2 url: https://2.4.6.8 template: metadata: name: '{{cluster}}-guestbook' spec: project: default source: repoURL: https://github.com/argoproj/argocd-example-apps.git targetRevision: HEAD path: guestbook destination: server: '{{url}}' namespace: guestbook
App of apps pattern
Argo CDで複数のapplicationをインストール(デプロイ)したい場合に用いられるパターン(構成)です。
他のapplicationを内包するapplicationを作成する構成です。
(以下ブログから引用)
サンプル
app-of-apps.yaml
が親アプリケーションで、app1.yaml
とapp2.yaml
が子アプリケーションです。
$ tree ├── app-of-apps.yaml └── apps ├── app1.yaml └── app2.yaml
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: app-of-apps spec: project: default source: repoURL: https://github.com/<ファイルがあるリポジトリ> targetRevision: HEAD path: apps destination: namespace: argocd server: https://kubernetes.default.svc
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: app1 spec: project: default source: repoURL: https://github.com/argoproj/argocd-example-apps.git targetRevision: HEAD path: guestbook destination: server: https://1.2.3.4 namespace: guestbook
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: app2 spec: project: default source: repoURL: https://github.com/argoproj/argocd-example-apps.git targetRevision: HEAD path: guestbook destination: server: https://2.4.6.8 namespace: guestbook
Application SetとApp of apps patternの使い分け
同一構成のApplicationを複数環境にデプロイしたいならApplication Set
単純に同一構成のApplicationを複数環境にデプロイしたい場合は、Application Setの方がtemplate機能を使えるため少なくシンプルに設定できます。
サンプルからも、Application Setの方が記述量やファイル数が少ないことがわかります。
Applicationのデプロイ順を制御したい場合は、App of apps pattern
Application Setだけでは、applicationのデプロイ順を制御することはできません。
App of apps patternとSyncWavesを組み合わせることで、デプロイ順の制御などが可能です。
Sync Phases and Waves - Argo CD - Declarative GitOps CD for Kubernetes
その他: 手動同期の運用
App of apps patternでは手動同期時に、親アプリケーションを同期すれば子アプリケーションも同期されます。
そのため、手動同期の運用を行っている場合、App of apps patternの方が楽ではと思うかもしれません。
似たようなことをApplication Setでやる場合、作成時にApplicationにLabelを付与して手動同期時にLabelを指定するといった方法があります。(手動同期したい単位で同じProjectに所属させて、Projectで絞り込んで手動同期でもOKです。)
apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: guestbook spec: generators: - list: elements: - cluster: app1 url: https://kubernetes.default.svc - cluster: app2 url: https://kubernetes.default.svc template: metadata: name: '{{cluster}}-guestbook' labels: name: guestbook # labelの付与 spec: project: default source: repoURL: https://github.com/argoproj/argocd-example-apps.git targetRevision: HEAD path: guestbook destination: server: '{{url}}' namespace: default
GUI上では特定のLabelだけが付与されているApplicationを絞り込むことができます。
絞り込んだ上で、手動同期を実行すれば複数Applicationへのデプロイも簡単な操作でできます。
CLIで実行する場合は、以下のように指定すればOKです。
$ argocd app sync -l name=guestbook
おわりに
Argo CDのApplication SetとApp of appsの違いや使い分けについてでした。
- 同一構成のApplicationを複数環境にデプロイしたい -> Application Set
- Application間の依存関係やデプロイ順を制御したい -> App of apps pattern
どう違うのか最初はイメージできなかったため、ブログにしてみました。
以上、AWS事業本部の佐藤(@chari7311)でした。